// /*
//  * 文件名：button.cpp
//  * 功能描述：按钮和编码器事件处理
//  */

// #include <Arduino.h>
// #include <Button.h>
// #include "endstop.h"
// #include "middle.h"
// #include "hbot_motion.h"
// #include "OTAUpdate.h"
// #include "LEDControl.h"
// #include <ESP32Encoder.h>
// #include "buzzer.h"
// #include "power_management.h"
// #include "screen.h" // 确保可以调用on_encoder_click_event等

// // 创建 OneButton 对象，连接到 button_pin 引脚，启用内部上拉电阻
// OneButton button(BUTTON_PIN, true);
// OneButton button2(ENCODER_KEY_PIN, true);
// ESP32Encoder encoder; // 只使用一个编码器

// // 事件队列句柄
// QueueHandle_t buttonEventQueue = NULL;

// // 屏幕刷新标志位
// volatile bool need_screen_refresh = false;

// // 已删除普通按钮双击事件函数

// void onDoubleClick2()
// {
//     // Serial.println("Button double clicked2");  // 输出双击按钮的消息
//     button_state2 = 0; // 保持向后兼容

//     // 投递事件到队列
//     ButtonEvent evt = {
//         .type = EVENT_ENCODER_DOUBLE_CLICK,
//         .value = 0,
//         .timestamp = millis()};
//     xQueueSendFromISR(buttonEventQueue, &evt, NULL);
// }

// void click2()
// {
//     // Serial.println("click2");  // 输出单击按钮的消息
//     button_state = 0; // 保持向后兼容

//     // 投递事件到队列
//     ButtonEvent evt = {
//         .type = EVENT_ENCODER_CLICK,
//         .value = 0,
//         .timestamp = millis()};
//     xQueueSendFromISR(buttonEventQueue, &evt, NULL);
// }

// // 长按事件函数
// void longclick()
// {
//     // Serial.println("longclick");  // 输出长按按钮的消息
//     ESP.restart(); // 触发 ESP32 重启

//     // 投递事件到队列（虽然会重启，但保持一致性）
//     ButtonEvent evt = {
//         .type = EVENT_BUTTON_LONG_PRESS,
//         .value = 0,
//         .timestamp = millis()};
//     xQueueSendFromISR(buttonEventQueue, &evt, NULL);
// }

// void init_button()
// {
//     // 创建事件队列，最多存储20个事件
//     buttonEventQueue = xQueueCreate(20, sizeof(ButtonEvent));
//     if (buttonEventQueue == NULL)
//     {
//         if (print_key)
//         {
//             Serial.println("错误：无法创建事件队列！");
//         }
//         return;
//     }

//     // 使用半四分频模式连接编码器
//     encoder.attachHalfQuad(ENCODER_B_PIN, ENCODER_A_PIN);
//     encoder.setFilter(100); // 100us滤波消抖
//     encoder.setCount(0);

//     // 创建按钮检测任务
//     xTaskCreate(buttonTask, "Button Task", 2048, NULL, 5, NULL);

//     // 创建事件处理任务
//     xTaskCreate(eventProcessingTask, "Event Task", 4096, NULL, 4, NULL);
// }

// int lastEncoderValue = 0; // 上一次的编码器值
// // 新增时间控制变量
// unsigned long lastEncoderUpdateTime = 0;

// /**
//  * @brief 按钮检测任务（FreeRTOS任务函数）
//  * @param pvParameters 任务参数（未使用）
//  *
//  * 持续检测按钮状态和编码器数值变化：
//  * 1. 绑定按钮单击/双击/长按事件
//  * 2. 监控编码器旋转数值
//  * 3. 控制蜂鸣器触发
//  */

// // 按钮检测任务：使用 FreeRTOS 来处理按钮状态
// void buttonTask(void *pvParameters)
// {
//     // 先绑定按钮事件
//     button.attachLongPressStart(longclick);
//     button2.attachClick(click2);
//     button2.attachDoubleClick(onDoubleClick2);

//     while (true)
//     {
//         button.tick();  // 检查按钮状态
//         button2.tick(); // 检查编码器按钮状态
//         //编码器对象
//         int Value = encoder.getCount();

//         // 检查是否为偶数（正负通用）且满足时间间隔要求
//         unsigned long currentTime = millis();
//         if (Value % 2 == 0 && (currentTime - lastEncoderUpdateTime >= 400))
//         {
//             // 只有当时间间隔大于400ms或者值发生变化时才更新
//             if (Value != lastEncoderValue)
//             {
//                 encoderValue = Value;                // 更新编码器值
//                 playBuzzer(beepLevel_g, 30, 0);      // 触发蜂鸣器
//                 lastEncoderValue = Value;            // 更新上一次的值
//                 lastEncoderUpdateTime = currentTime; // 更新时间戳
//                 update_encoder_activity();           // 新增：更新编码器活动时间

//                 // 投递编码器旋转事件到队列
//                 ButtonEvent evt = {
//                     .type = EVENT_ENCODER_ROTATE,
//                     .value = Value,
//                     .timestamp = currentTime};
//                 xQueueSend(buttonEventQueue, &evt, 0); // 非阻塞发送
//             }
//         }
//         vTaskDelay(50 / portTICK_PERIOD_MS); // 延时 50ms，避免过度占用 CPU 资源
//     }
// }

// /**
//  * @brief 事件处理任务（FreeRTOS任务函数）
//  * @param pvParameters 任务参数（未使用）
//  *
//  * 统一处理所有按钮和编码器事件，提升系统健壮性
//  */
// void eventProcessingTask(void *pvParameters)
// {
//     ButtonEvent evt;
//     if (print_key)
//         Serial.println("事件处理任务已启动");

//     while (1)
//     {
//         // 等待事件（阻塞式）
//         if (xQueueReceive(buttonEventQueue, &evt, portMAX_DELAY) == pdPASS)
//         {
//             // 统一处理所有事件
//             handleButtonEvent(&evt);
//         }
//     }
// }

// /**
//  * @brief 处理按钮事件
//  * @param evt 事件结构体指针
//  *
//  * 根据事件类型执行相应的业务逻辑
//  */
// void handleButtonEvent(ButtonEvent *evt)
// {
//     if (evt == NULL)
//         return;
// //选择事件类型
//     switch (evt->type)
//     {
//     case EVENT_ENCODER_CLICK:
//         need_screen_refresh = true;
//         // 事件驱动页面切换
//         on_encoder_click_event();
//         if (print_key)
//         {
//             Serial.printf("处理编码器单击事件，时间戳: %lu\n", evt->timestamp);
//         }
//         button_state = 1; // 重置状态，避免重复处理
//         break;
//     case EVENT_ENCODER_DOUBLE_CLICK:
//         need_screen_refresh = true;
//         // 事件驱动主页面切换
//         on_encoder_double_click_event();
//         if (print_key)
//         {
//             Serial.printf("处理编码器双击事件，时间戳: %lu\n", evt->timestamp);
//         }
//         button_state2 = 1; // 重置状态，避免重复处理
//         break;
//     case EVENT_ENCODER_ROTATE:
//         // 处理编码器旋转
//         handleEncoderRotation(evt->value);
//         break;
//     case EVENT_BUTTON_LONG_PRESS:
//         // 处理普通按钮长按
//         // Serial.printf("处理普通按钮长按事件，时间戳: %lu\n", evt->timestamp);
//         break;
//     default:
//         // Serial.printf("未知事件类型: %d\n", evt->type);
//         break;
//     }
// }

// /**
//  * @brief 处理编码器旋转事件
//  * @param value 编码器数值
//  *
//  * 根据当前页面状态处理编码器旋转，并立即刷新屏幕
//  */
// void handleEncoderRotation(int value)
// {
//     // 目前保持原有的处理方式，通过全局变量encoderValue传递
//     if (print_key)
//     {
//         Serial.printf("处理编码器旋转事件，数值: %d\n", value);
//     }
//     // 设置屏幕刷新标志，让Task1立即处理一次屏幕刷新
//     need_screen_refresh = true;

//     // 强制刷新LVGL显示，确保屏幕立即更新
//     lv_obj_invalidate(lv_scr_act());
// }



/*
    按钮函数，检测按键长按，用来重启
*/
#include "button.h"
#include "event.h"
#include "OTAUpdate.h"
#include "LEDControl.h"
#include "buzzer.h"
#include "power_management.h"
#include <OneButton.h>  // 包含OneButton库头文件
#include "config.h"

OneButton button(BUTTON_PIN, true);
void longclick() {
    ESP.restart(); // 触发重启

    ButtonEvent evt = {
        .type = EVENT_BUTTON_LONG_PRESS,
        .value = 0,
        .timestamp = millis()};
    xQueueSendFromISR(buttonEventQueue, &evt, NULL);
}

void init_button() {
    // 普通按钮绑定长按事件
    button.attachLongPressStart(longclick);
}

void buttonTask(void *pvParameters) {
    while (true) {
        button.tick(); // 处理普通按钮
        vTaskDelay(50 / portTICK_PERIOD_MS);
    }
}
